package com.sunriz.ctrl.server.utils.serial;

import com.ghgande.j2mod.modbus.facade.ModbusSerialMaster;
import com.ghgande.j2mod.modbus.util.SerialParameters;

/**
 * ClassName: ModbusRtuManger
 * Package: com.sunriz.ctrl.server.utils.modbus
 * Description:
 *
 * @Author BuTang
 * @Create 2025/1/15 16:12
 * @Version 1.0
 */
public class ModbusRtuManger {
    /**
     * 私有化构造方法，防止外部实例化
     */
    private ModbusRtuManger() {}

    /**
     * 静态内部类，JVM在加载外部类时并不会立即加载内部类，只有调用 getInstance 方法时才会加载该内部类
     */
    private static class SingletonHelper {
        // 静态初始化 ModbusRtuManger 实例
        private static final ModbusRtuManger INSTANCE = new ModbusRtuManger();
    }

    /**
     * 提供公共的静态方法来获取唯一实例
     * @return 返回一个modbus rtu的链接实例
     */
    public static ModbusRtuManger getInstance() {
        return SingletonHelper.INSTANCE;
    }

    private static ModbusSerialMaster master ;

    /**
     * 使用可变配置信息进行modbus rtu创建
     * @return 返回一个ModbusSerialMaster实例，可进行modbus通讯
     */
    public ModbusSerialMaster create(String portName,int baudRate,int dataBits,int stopBits,String Parity,String encoding, int timout , int retries){
        if (master != null){
            return master;
        }

        SerialParameters params = new SerialParameters();
        params.setPortName(portName);
        params.setBaudRate(baudRate);
        params.setDatabits(dataBits);
        params.setParity(Parity);
        params.setStopbits(stopBits);
        params.setEncoding(encoding);

        // 创建ModbusRTU主站,设置超时时间
        master = new ModbusSerialMaster(params);
        master.setTimeout(timout);
        master.setRetries(retries);

        // 连接到Modbus从站
        try {
            master.connect();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        return master;
    }

    /**
     * 使用固定的配置信息进行modbus rtu创建
     * @return 返回一个ModbusSerialMaster实例，可进行modbus通讯
     */
    public ModbusSerialMaster create(){
        if (master != null){
            return master;
        }
        SerialParameters params = new SerialParameters();
        params.setPortName("COM1");
        params.setBaudRate(115200);
        params.setDatabits(8);
        params.setParity("None");
        params.setStopbits(1);
        params.setEncoding("RTU");

        // 创建ModbusRTU主站,设置超时时间
        master = new ModbusSerialMaster(params);
        master.setTimeout(50);

        // 连接到Modbus从站
        try {
            master.connect();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        return master;
    }

    public void disConnect() {
        if (!(master == null)) {
            master.disconnect();
            master = null;
        }
    }

}

